home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
gnu
/
nethack.lha
/
nethack-3.1
/
util
/
dgn_main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-10-19
|
3KB
|
152 lines
/* SCCS Id: @(#)dgn_main.c 3.1 92/03/10 */
/* Copyright (c) 1989 by Jean-Christophe Collet */
/* Copyright (c) 1990 by M. Stephenson */
/* NetHack may be freely redistributed. See license for details. */
/*
* This file contains the main function for the parser
* and some useful functions needed by yacc
*/
#include "config.h"
#ifdef MICRO
# undef exit
# ifndef AMIGA
extern void FDECL(exit, (int));
# endif
#endif
#if defined(MICRO) && !defined(AMIGA)
# define WRMODE "w+b"
#else
# define WRMODE "w+"
#endif
#ifdef MAC
# ifdef applec
# define MPWTOOL
# include <CursorCtl.h>
# endif
#endif
#ifndef MPWTOOL
# define SpinCursor(x)
#endif
#define MAX_ERRORS 25
extern int line_number;
char *fname = "(stdin)";
int fatal_error = 0;
int FDECL (main, (int, char **));
int NDECL (yyparse);
void FDECL (yyerror, (char *));
void FDECL (yywarning, (char *));
int NDECL (yywrap);
void FDECL (init_yyin, (FILE *));
void FDECL (init_yyout, (FILE *));
#ifdef AZTEC_36
FILE *FDECL (freopen, (char *, char *, FILE *));
#endif
int
main(argc, argv)
int argc;
char **argv;
{
char infile[64], outfile[64];
FILE *fin, *fout;
int i, len;
#ifdef MAC_THINKC5
static char *mac_argv[] = { "dgn_comp", /* dummy argv[0] */
":dat:dungeon.pdf"
};
argc = SIZE(mac_argv);
argv = mac_argv;
#endif
if (argc == 1) { /* Read standard input */
init_yyin(stdin);
init_yyout(stdout);
yyparse();
} else /* Otherwise every argument is a filename */
for(i=1; i<argc; i++) {
fname = strcpy(infile, argv[i]);
len = strlen(fname) - 4; /* length excluding suffix */
if (len < 0 || strncmp(".pdf", fname + len, 4)) {
fprintf(stderr,
"Error - file name \"%s\" in wrong format.\n",
fname);
continue;
}
#ifdef VMS /* make sure to avoid possible interaction with logical name */
len++; /* retain "." as trailing punctuation */
#endif
(void) strncpy(outfile, infile, len);
outfile[len] = '\0';
fin = freopen(infile, "r", stdin);
if (!fin) {
fprintf(stderr,"Can't open %s for input\n", infile);
perror(infile);
continue;
}
fout = freopen(outfile, WRMODE, stdout);
if (!fout) {
fprintf(stderr,"Can't open %s for output\n", outfile);
perror(outfile);
continue;
}
init_yyin(fin);
init_yyout(fout);
yyparse();
line_number = 1;
fatal_error = 0;
}
#ifndef VMS
return 0;
#else
return 1; /* vms success */
#endif /*VMS*/
}
/*
* Each time the parser detects an error, it uses this function.
* Here we take count of the errors. To continue farther than
* MAX_ERRORS wouldn't be reasonable.
*/
void yyerror(s)
char *s;
{
fprintf(stderr,"%s : line %d : %s\n",fname,line_number, s);
if (++fatal_error > MAX_ERRORS) {
fprintf(stderr,"Too many errors, good bye!\n");
exit(1);
}
}
/*
* Just display a warning (that is : a non fatal error)
*/
void yywarning(s)
char *s;
{
fprintf(stderr,"%s : line %d : WARNING : %s\n",fname,line_number,s);
}
int yywrap()
{
SpinCursor(3); /* Don't know if this is a good place to put it ?
Is it called for our grammar ? Often enough ?
Too often ? -- h+ */
return 1;
}
/*dgn_main.c*/